package com.youdo.careyes.utils;

import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;

import androidx.annotation.NonNull;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class VideoFileSearcher {
    private static final String TAG = "VideoFileSearcher";

    /**
     * 获取所有视频文件信息(耗时工作,0-图片,2-视频)
     */
    public static List<VideoInfo> getAllVideos(Context context, int type) {
        List<VideoInfo> videoList = new ArrayList<>();
        Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;// 访问外部存储中的视频文件（如电影、录制视频）
        // 要查询的字段
        String[] projection = {
                MediaStore.Video.Media._ID,
                MediaStore.Video.Media.DATA,  // 文件路径
                MediaStore.Video.Media.DISPLAY_NAME,  // 文件名
                MediaStore.Video.Media.DURATION,  // 时长(毫秒)
                MediaStore.Video.Media.SIZE  // 文件大小(字节)
        };
        // 使用MediaStore查询所有视频（推荐方式）
        if (type == 1) {
            uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;// 访问外部存储（如SD卡）中的音频文件（如音乐、录音）
        } else if (type == 2) {
            uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;// 访问外部存储中的图片文件（如照片、截图）
            projection = new String[]{
                    MediaStore.Images.Media._ID,
                    MediaStore.Images.Media.DATA,  // 文件路径
                    MediaStore.Images.Media.DISPLAY_NAME,  // 文件名
                    MediaStore.Images.Media.SIZE  // 文件大小(字节)
            };
        }
        // 排序方式：按修改时间降序
        String sortOrder = MediaStore.Video.Media.DATE_MODIFIED + " DESC";
        int durationIndex = 0;
        ContentResolver resolver = context.getContentResolver();
        try (Cursor cursor = resolver.query(uri, projection, null, null, sortOrder)) {
            if (cursor != null && cursor.moveToFirst()) {
                int pathIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
                int nameIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);
                if (type != 2) {
                    durationIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION);
                }
                int sizeIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE);

                do {
                    String path = cursor.getString(pathIndex);
                    String name = cursor.getString(nameIndex);
                    long duration = 0;
                    if (type != 2) {
                        duration = cursor.getLong(durationIndex);
                    }

                    long size = cursor.getLong(sizeIndex);

                    // 判断文件是否存在
                    boolean exists = new File(path).exists();
                    Log.e(TAG, "查询: exists=" + exists + ",path=" + path);
                    if (exists) {
                        VideoInfo info = new VideoInfo();
                        info.path = path;
                        info.name = name;
                        if (type != 2) {
                            info.duration = duration;
                        }
                        info.size = size;
                        info.type = type;
                        // 判断是否为外置SD卡
                        info.isExternalSd = isExternalSdCard(path, context);
                        if (type == 0) {
                            info.img = getVideoFrame(context, path, 0);
                        }
                        videoList.add(info);
                    }
                } while (cursor.moveToNext());
            }
        } catch (Exception e) {
            Log.e(TAG, "查询视频失败: " + e.getMessage());
        }

        return videoList;
    }

    /**
     * 判断文件是否位于外置SD卡
     */
    private static boolean isExternalSdCard(String path, Context context) {
        // 获取内置存储路径
        String internalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath();

        // 内置存储直接返回false
        if (path.startsWith(internalStoragePath)) {
            return false;
        }

        // 检查是否在外置SD卡路径下
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            for (File file : context.getExternalFilesDirs(null)) {
                if (file != null) {
                    String sdPath = file.getAbsolutePath().split("Android")[0];
                    if (path.startsWith(sdPath) && !sdPath.equals(internalStoragePath)) {
                        return true;
                    }
                }
            }
        }

        return false;
    }

    private static Bitmap getVideoFrame(Context context, String videoPath, long timeMs) {
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        Bitmap frameBitmap = null;

        try {
            // 设置视频文件路径
            if (videoPath.startsWith("content://")) {
                // 处理ContentProvider的Uri（如从相册选择的视频）
                retriever.setDataSource(context, Uri.parse(videoPath));
            } else {
                // 处理本地文件路径
                retriever.setDataSource(videoPath);
            }

            // 获取指定时间点的帧
            frameBitmap = retriever.getFrameAtTime(timeMs * 1000,
                    MediaMetadataRetriever.OPTION_CLOSEST_SYNC);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            try {
                retriever.release();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return frameBitmap;
    }

    /**
     * 视频信息实体类
     */
    public static class VideoInfo {
        public String path;         // 文件路径
        public String name;         // 文件名
        public Bitmap img;         // 文件名
        public long duration;       // 时长(毫秒)
        public long size;           // 文件大小(字节)
        public boolean isExternalSd;// 是否位于外置SD卡
        public int type;// 0-视频 2-图片 其他-视频

        public boolean isImage() {
            return type == 2;
        }

        @NonNull
        @Override
        public String toString() {
            return "VideoInfo{" +
                    "path='" + path + '\'' +
                    ", name='" + name + '\'' +
                    ", img=" + img +
                    ", duration=" + duration +
                    ", size=" + size +
                    ", isExternalSd=" + isExternalSd +
                    ", type=" + type +
                    '}';
        }
    }
}
